SPB Git

spb/llmindex Public

The discriminative, contamination-resistant, fully transparent LLM ranking — updated live.

TypeScript 77.9% TeX 15.2% Python 3.7% SQL 1.4% JavaScript 1.1% Shell 0.5%
1.7 KB · 50 lines typescript
Raw Blame History
1/**2 * llmindex.io — GET /api/v1/leaderboard/:domain (per-domain ranking + sub-metrics)3 * Author:  Simon-Pierre Boucher4 * Contact: contact@spboucher.ai5 * License: Proprietary — © Simon-Pierre Boucher, all rights reserved6 */7import { type NextRequest } from 'next/server';8import { isDomain } from '@llmindex/scoring';9import { getLeaderboard } from '@/lib/data';10import { apiError, apiJson } from '@/lib/api';11import { rateLimit } from '@/lib/rate-limit';1213export const dynamic = 'force-dynamic';1415export async function GET(req: NextRequest, { params }: { params: { domain: string } }) {16  const limited = await rateLimit(req);17  if (limited) return limited;18  if (!isDomain(params.domain)) return apiError(404, 'unknown_domain');19  const search = req.nextUrl.searchParams;20  const limit = Math.min(200, Math.max(1, Number(search.get('limit') ?? 50)));21  const offset = Math.max(0, Number(search.get('offset') ?? 0));22  const data = await getLeaderboard(params.domain, limit, offset);23  if (!data) return apiError(503, 'no_score_run_available');24  return apiJson(25    {26      index_version: data.run.indexVersion,27      domain: params.domain,28      run: {29        id: data.run.id,30        kind: data.run.kind,31        status: data.run.status,32        created_at: data.run.createdAt,33        notes: data.run.notes,34      },35      pagination: { limit, offset, count: data.entries.length },36      entries: data.entries.map((e) => ({37        rank: e.rank,38        model: e.slug,39        name: e.name,40        provider: e.provider,41        score: e.score,42        score_low: e.scoreLow,43        score_high: e.scoreHigh,44        sub_metrics: e.subMetrics,45      })),46    },47    { cacheSeconds: 3600 },48  );49}50